package transaction.controller;

import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import transaction.model.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import transaction.service.UserService;

import javax.annotation.Resource;

/**
 * @Author quan
 * @Description 事务的两种实现方式
 * @Date 2023/7/29 17:43
 */

/**
 * 手动提交事务
 */
//@Slf4j
//@RestController
//@RequestMapping("/trans")
//public class TransactionController {
    /**
     * 手动提交事务
     */
//    @Autowired
//    private UserService userService;
//    //1、拿到事务管理器
//    @Autowired
//    private DataSourceTransactionManager dataSourceTransactionManager;
//    //2、定义事务属性
//    @Autowired
//    private TransactionDefinition transactionDefinition;
//
//    @RequestMapping("/addUser1")
//    public Integer addUser(String username,String password){
//        //3、开启事务
//        TransactionStatus transaction = dataSourceTransactionManager.getTransaction(transactionDefinition);
//        //4、插入数据
//        User user = new User(username,password);
//        Integer result = userService.insert(user);
//        log.info("影响的行数是："+result);
//        //5、提交事务
////        dataSourceTransactionManager.commit(transaction);
//        //6、回滚事务
//        dataSourceTransactionManager.rollback(transaction);
//        return result;
//    }
//}

    /**
     * 自动提交事务
     */
//@Slf4j
//@RestController
//@RequestMapping("/trans")
//public class TransactionController {
//    @Autowired
//    private UserService userService;
//
//    //声明式事务的实现很简单，只需要在需要的⽅法上添加 @Transactional 注解就可以实现了，⽆需⼿动
//    //开启事务和提交事务，进⼊⽅法时⾃动开启事务，⽅法执⾏完会⾃动提交事务;如果中途发⽣了没有处
//    //理的异常会⾃动回滚事务
//    @RequestMapping("/addUser2")
//    //表示发生算数异常的时候不进行回滚
////    @Transactional(noRollbackFor = ArithmeticException.class)
//    @Transactional
//    public Integer addUser2(String username,String password){
//        //插入数据
//        User user = new User(username,password);
//        Integer result = userService.insert(user);
//        //模拟异常
//        int a = 10/0;
//        return result;
//    }
//}

/**
 * @Transactional 在异常被捕获的时候，不会进行回滚。加上参数@Transactional(rollbackFor = Exception.class)就对所有异常都捕获了
 */
@RestController
@RequestMapping("/trans")
public class UserController {
    @Resource
    private UserService userService;
    @RequestMapping("/addUser")
    //对所有异常都回滚的两种方式
    //方式1
//    @Transactional(rollbackFor = Exception.class)
    @Transactional
    public Object addUser(String username,String password) {
        //插入数据
        User user = new User(username,password);
        Integer result = userService.insert(user);
        try {
            // 执⾏了异常代码(0不能做除数)
            int i = 10 / 0;
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        //方式2：
        // ⼿动回滚事务
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        return result;
    }
}

